package com.xiaowu.netmusic.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;

/**
 * @description: JWT 工具类，支持存储 username 和 userId
 * @author: xiaowu
 * @time: 2024/12/23 21:50
 */
public class JwtUtil {

    // 使用自动生成的 256 位密钥
    private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private static final long EXPIRATION_TIME = 365L * 24 * 60 * 60 * 1000; // 1年

    /**
     * 生成 JWT（带上 userId 和 username）
     */
    public static String generateToken(Long userId, String username) {
        return Jwts.builder()
                .setSubject(username) // 可以理解为主题，这里用 username
                .claim("userId", userId) // 自定义的 payload
                .setIssuedAt(new Date()) // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
                .signWith(key)
                .compact();
    }

    /**
     * 验证 JWT 并返回 Claims
     */
    public static Claims validateToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (JwtException e) {
            throw new IllegalArgumentException("Invalid JWT token");
        }
    }

    /**
     * 从 JWT 里面解析出 username
     */
    public static String getUsernameFromToken(String token) {
        return validateToken(token).getSubject();
    }

    /**
     * 从 JWT 里面解析出 userId
     */
    public static Long getUserIdFromToken(String token) {
        Object userId = validateToken(token).get("userId");
        if (userId instanceof Integer) {
            return ((Integer) userId).longValue();
        }
        return (Long) userId;
    }
}
